package projeto.controller.testes;

import static org.junit.Assert.*;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import projeto.controller.ComparaRecomendacao;
import projeto.model.Estabelecimento;
import projeto.model.LeituraDeDados;
import projeto.model.Recomenda;
import projeto.model.RecomendaCosseno;
import projeto.model.RecomendaPopularidade;
import projeto.model.Usuario;

public class ComparaRecomendacaoTest {

	private Usuario user1,user2,user3;
	private Integer[] opinioes1 = {4,2,0};
	private List<Integer> listaOpinioes1 = Arrays.asList(opinioes1);
	private Integer[] opinioes2 = {3,0,0};
	private List<Integer> listaOpinioes2 = Arrays.asList(opinioes2);
	private List<Integer> listaOpinioes3 = Arrays.asList(4,0,0);
	private List<Usuario> usuarios;
	private List<Estabelecimento> estabs;
	
	@Before
	public void criaArquivos() throws Exception{
		user1 = new Usuario("13/05/2011 18:35:48","Nazareno",listaOpinioes1);
		user2 = new Usuario("13/05/2011 18:46:59","Joao",listaOpinioes2);
		user3 = new Usuario("13/05/2001 18:50:53","Jeymisson Oliveira",listaOpinioes3);
		usuarios = new ArrayList<Usuario>();
		usuarios.add(user1);
		usuarios.add(user2);
		criaArquivoTeste("ArquivoDeUsuarioValido.data",usuarios);
		criaArquivoEstTeste("TesteEsts.data");
		usuarios = LeituraDeDados.lerUsuarios("ArquivoDeUsuarioValido.data");
		estabs = LeituraDeDados.lerEstabelecimentos("TesteEsts.data");

		LeituraDeDados.verificaTabelas(estabs);
	}
	
	@Test
	public void testAcertosRecomendacao() {
		Recomenda cosseno = RecomendaCosseno.getInstance();
//		estsRecomendados = cosseno.getRecomendacao(estabs, usuarios, user3, 1);
		double acerto = ComparaRecomendacao.acertosRecomendacao(estabs, usuarios, 1, cosseno);
		System.out.println(acerto);
		Assert.assertTrue("Erro em comparaRecomendacao", acerto == 66.67);
		
	}
	
	private void criaArquivoTeste(String fileName, List<Usuario> users){
		PrintWriter outputStream = null;
		String linhaInicial = "Indicação de data e hora;Seu nome;Bar do Cuscuz e Restaurante;Baixinho Bar e Restaurante;Bar do George";
		
		try{
			outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8")));
			if(users != null){
				outputStream.println(linhaInicial);
				for(Usuario u: users){
					outputStream.println(u.toString());
				}				
			}
			
		}catch(FileNotFoundException e2){

		}catch(IOException e){
		}
		finally{
			if (outputStream != null) {
	            outputStream.close();
	         }
		}
	}
	
	private void criaArquivoEstTeste(String fileName){
		PrintWriter outputStream = null;
		try{
			outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8")));
			outputStream.println("Baixinho Bar e Restaurante;Rua papa João XXIII, 101, Liberdade;A la carte");
			outputStream.println("Bar do Cuscuz e Restaurante;Rua Dr Severino Cruz, 771, Centro;A la carte");
			outputStream.println("Bar do George;Rua Almirante Barroso, Liberdade;A la carte");
		
		
		}catch(FileNotFoundException e2){

		}catch(IOException e){
		}
		finally{
			if (outputStream != null) {
	            outputStream.close();
	         }
		}
	}
}
